]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Synchronize shell startup
authorJasper St. Pierre <jstpierre@mecheye.net>
Mon, 4 Nov 2013 15:07:44 +0000 (10:07 -0500)
committerJasper St. Pierre <jstpierre@mecheye.net>
Mon, 4 Nov 2013 16:50:20 +0000 (11:50 -0500)
The asynchronous nature of extension loading, session loading, and more,
makes the code racy as to what is initialized first, and hard to debug.
Additionally, since gjs is single-threaded, the only code we're running
in a thread anyway is readdir, which is going to be I/O bound, so the
code here is actually likely to be faster.

Drop this in favor of some good old fashioned synchronous loading.

js/extensionPrefs/main.js
js/misc/extensionUtils.js
js/misc/fileUtils.js
js/ui/extensionSystem.js
js/ui/main.js
js/ui/remoteSearch.js
js/ui/sessionMode.js

index 8e3355d703b250289e6a6d35621b55bb22cfe954..a3f516e84d6c76ee9d6f3fe82b4e9e901d5ff2a7 100644 (file)
@@ -206,11 +206,11 @@ const Application = new Lang.Class({
     _scanExtensions: function() {
         let finder = new ExtensionUtils.ExtensionFinder();
         finder.connect('extension-found', Lang.bind(this, this._extensionFound));
-        finder.connect('extensions-loaded', Lang.bind(this, this._extensionsLoaded));
         finder.scanExtensions();
+        this._extensionsLoaded();
     },
 
-    _extensionFound: function(signals, extension) {
+    _extensionFound: function(finder, extension) {
         let iter = this._model.append();
         this._model.set(iter, [0, 1], [extension.uuid, extension.metadata.name]);
         this._extensionIters[extension.uuid] = iter;
index 7c6769a5a5f8557a0917606d6133ee12c583d1f0..afdc3cd3eaedd6a5c91ba8f743bcea2bca7e326b 100644 (file)
@@ -174,17 +174,9 @@ const ExtensionFinder = new Lang.Class({
         this.emit('extension-found', extension);
     },
 
-    _extensionsLoaded: function() {
-        this.emit('extensions-loaded');
-    },
-
     scanExtensions: function() {
         let perUserDir = Gio.File.new_for_path(global.userdatadir);
-        FileUtils.collectFromDatadirsAsync('extensions',
-                                           { processFile: Lang.bind(this, this._loadExtension),
-                                             loadedCallback: Lang.bind(this, this._extensionsLoaded),
-                                             includeUserDir: true,
-                                             data: perUserDir });
+        FileUtils.collectFromDatadirs('extensions', true, Lang.bind(this, this._loadExtension, perUserDir));
     }
 });
 Signals.addSignalMethods(ExtensionFinder.prototype);
index 767c005fad723a6c51acd59154a146b294452bed..cec06d95f227684ea9a70c3e7e8486d7d4ddc34a 100644 (file)
@@ -25,60 +25,27 @@ function listDirAsync(file, callback) {
     });
 }
 
-function _collectFromDirectoryAsync(dir, loadState) {
-    function done() {
-        loadState.numLoading--;
-        if (loadState.loadedCallback &&
-            loadState.numLoading == 0)
-            loadState.loadedCallback(loadState.data);
-    }
-
-    dir.query_info_async('standard::type', Gio.FileQueryInfoFlags.NONE,
-        GLib.PRIORITY_DEFAULT, null, function(object, res) {
-            try {
-                object.query_info_finish(res);
-            } catch (e) {
-                if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
-                    log(e.message);
-                done();
-                return;
-            }
-
-            listDirAsync(dir, Lang.bind(this, function(infos) {
-                for (let i = 0; i < infos.length; i++)
-                    loadState.processFile(dir.get_child(infos[i].get_name()),
-                                          infos[i], loadState.data);
-                done();
-            }));
-        });
-}
-
-function collectFromDatadirsAsync(subdir, params) {
-    params = Params.parse(params, { includeUserDir: false,
-                                    processFile: null,
-                                    loadedCallback: null,
-                                    data: null });
-    let loadState = { data: params.data,
-                      numLoading: 0,
-                      loadedCallback: params.loadedCallback,
-                      processFile: params.processFile };
-
-    if (params.processFile == null) {
-        if (params.loadedCallback)
-            params.loadedCallback(params.data);
-        return;
-    }
-
+function collectFromDatadirs(subdir, includeUserDir, processFile) {
     let dataDirs = GLib.get_system_data_dirs();
-    if (params.includeUserDir)
+    if (includeUserDir)
         dataDirs.unshift(GLib.get_user_data_dir());
-    loadState.numLoading = dataDirs.length;
 
     for (let i = 0; i < dataDirs.length; i++) {
         let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', subdir]);
         let dir = Gio.File.new_for_path(path);
 
-        _collectFromDirectoryAsync(dir, loadState);
+        let fileEnum;
+        try {
+            fileEnum = dir.enumerate_children('standard::name,standard::type',
+                                              Gio.FileQueryInfoFlags.NONE, null);
+        } catch (e) {
+            fileEnum = null;
+        }
+        if (fileEnum != null) {
+            let info;
+            while ((info = fileEnum.next_file(null)))
+                processFile(fileEnum.get_child(info), info);
+        }
     }
 }
 
index dde7b821d01b9ea0bfc365eb8de949375d925ffd..40a48876ef81578e70965e360eb6c3b3fadc5bb6 100644 (file)
@@ -253,7 +253,7 @@ function onEnabledExtensionsChanged() {
     newEnabledExtensions.filter(function(uuid) {
         return enabledExtensions.indexOf(uuid) == -1;
     }).forEach(function(uuid) {
-            enableExtension(uuid);
+        enableExtension(uuid);
     });
 
     // Find and disable all the newly disabled extensions: UUIDs found in the
@@ -261,7 +261,7 @@ function onEnabledExtensionsChanged() {
     enabledExtensions.filter(function(item) {
         return newEnabledExtensions.indexOf(item) == -1;
     }).forEach(function(uuid) {
-            disableExtension(uuid);
+        disableExtension(uuid);
     });
 
     enabledExtensions = newEnabledExtensions;
@@ -272,7 +272,7 @@ function _loadExtensions() {
     enabledExtensions = getEnabledExtensions();
 
     let finder = new ExtensionUtils.ExtensionFinder();
-    finder.connect('extension-found', function(signals, extension) {
+    finder.connect('extension-found', function(finder, extension) {
         loadExtension(extension);
     });
     finder.scanExtensions();
index 6f961be7d629d2710b758a47808385a7816a2b15..cf1a9a43b9c6a79a7022e322dba87fda9b9d7203 100644 (file)
@@ -112,11 +112,6 @@ function start() {
     Gio.DesktopAppInfo.set_desktop_env('GNOME');
 
     sessionMode = new SessionMode.SessionMode();
-    sessionMode.connect('sessions-loaded', _sessionsLoaded);
-    sessionMode.init();
-}
-
-function _sessionsLoaded() {
     sessionMode.connect('updated', _sessionUpdated);
     _initializePrefs();
     _initializeUI();
index cd95069ea8df1242a3efe6c10d09c8ef4a33c176..4e7574c5a96ac51bd1ffb7f714460b81f1ff8c74 100644 (file)
@@ -7,6 +7,7 @@ const Lang = imports.lang;
 const St = imports.gi.St;
 const Shell = imports.gi.Shell;
 
+const FileUtils = imports.misc.fileUtils;
 const Search = imports.ui.search;
 
 const KEY_FILE_GROUP = 'Shell Search Provider';
@@ -122,23 +123,7 @@ function loadRemoteSearchProviders(callback) {
         return;
     }
 
-    let dataDirs = GLib.get_system_data_dirs();
-    dataDirs.forEach(function(dataDir) {
-        let path = GLib.build_filenamev([dataDir, 'gnome-shell', 'search-providers']);
-        let dir = Gio.File.new_for_path(path);
-        let fileEnum;
-        try {
-            fileEnum = dir.enumerate_children('standard::name,standard::type',
-                                              Gio.FileQueryInfoFlags.NONE, null);
-        } catch (e) {
-            fileEnum = null;
-        }
-        if (fileEnum != null) {
-            let info;
-            while ((info = fileEnum.next_file(null)))
-                loadRemoteSearchProvider(fileEnum.get_child(info));
-        }
-    });
+    FileUtils.collectFromDatadirs('search-providers', false, loadRemoteSearchProvider);
 
     let sortOrder = searchSettings.get_strv('sort-order');
 
index eb04c62405f5ece69237d2239012a78003090c1f..510adc5f42088e72cdbac39819e4271b6ad70f2a 100644 (file)
@@ -102,19 +102,12 @@ const _modes = {
     }
 };
 
-function _getModes(modesLoadedCallback) {
-    FileUtils.collectFromDatadirsAsync('modes',
-                                       { processFile: _loadMode,
-                                         loadedCallback: modesLoadedCallback,
-                                         data: _modes });
-}
-
-function _loadMode(file, info, loadedData) {
+function _loadMode(file, info) {
     let name = info.get_name();
     let suffix = name.indexOf('.json');
     let modeName = suffix == -1 ? name : name.slice(name, suffix);
 
-    if (loadedData.hasOwnProperty(modeName))
+    if (_modes.hasOwnProperty(modeName))
         return;
 
     let fileContent, success, tag, newMode;
@@ -125,18 +118,23 @@ function _loadMode(file, info, loadedData) {
         return;
     }
 
-    loadedData[modeName] = {};
+    _modes[modeName] = {};
     let propBlacklist = ['unlockDialog'];
     for (let prop in loadedData[DEFAULT_MODE]) {
         if (newMode[prop] !== undefined &&
             propBlacklist.indexOf(prop) == -1)
-            loadedData[modeName][prop]= newMode[prop];
+            loadedData[modeName][prop] = newMode[prop];
     }
-    loadedData[modeName]['isPrimary'] = true;
+    _modes[modeName]['isPrimary'] = true;
+}
+
+function _getModes() {
+    FileUtils.collectFromDatadirs('modes', false, _loadMode);
 }
 
 function listModes() {
-    _getModes(function(modes) {
+    let modes = _getModes();
+    modes.forEach(function() {
         let names = Object.getOwnPropertyNames(modes);
         for (let i = 0; i < names.length; i++)
             if (_modes[names[i]].isPrimary)
@@ -149,17 +147,12 @@ function listModes() {
 const SessionMode = new Lang.Class({
     Name: 'SessionMode',
 
-    init: function() {
-        _getModes(Lang.bind(this, function(modes) {
-            this._modes = modes;
-            let primary = modes[global.session_mode] &&
-                          modes[global.session_mode].isPrimary;
-            let mode = primary ? global.session_mode : 'user';
-            this._modeStack = [mode];
-            this._sync();
-
-            this.emit('sessions-loaded');
-        }));
+    _init: function() {
+        let isPrimary = (_modes[global.session_mode] &&
+                         _modes[global.session_mode].isPrimary);
+        let mode = isPrimary ? global.session_mode : 'user';
+        this._modeStack = [mode];
+        this._sync();
     },
 
     pushMode: function(mode) {
@@ -186,13 +179,13 @@ const SessionMode = new Lang.Class({
     },
 
     _sync: function() {
-        let params = this._modes[this.currentMode];
+        let params = _modes[this.currentMode];
         let defaults;
         if (params.parentMode)
-            defaults = Params.parse(this._modes[params.parentMode],
-                                    this._modes[DEFAULT_MODE]);
+            defaults = Params.parse(_modes[params.parentMode],
+                                    _modes[DEFAULT_MODE]);
         else
-            defaults = this._modes[DEFAULT_MODE];
+            defaults = _modes[DEFAULT_MODE];
         params = Params.parse(params, defaults);
 
         // A simplified version of Lang.copyProperties, handles